package View;

import DAO.ClienteDAO;
import DAO.ItemDAO;
import DAO.NotaFiscalDAO;
import DAO.PedidoDAO;
import Pojo.Item;
import Pojo.NotaFiscal;
import Pojo.Pedido;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Scanner;

/**Classe que serve como menu para controle dos Pedidos
 * 
 * @author Vitor
 */
public class MenuPedido {
    /**Metodo que imprime uma lista de opcoes para o usuario para que ele escolhe dentre elas
     a que ele deseja fazer no pedido*/
    private void imprimirMenu(){
        System.out.println("\n-------Escolha uma opcao-----");
        System.out.println("(1)Cadastra Pedido");
        System.out.println("(2)Listar pedidos em aberto");
        System.out.println("(3)alterar pedido ");
        System.out.println("(4)Fechar Pedido ");
        System.out.println("(5)Listar Pedido fechados ");
        System.out.println("(6)Voltar para o menu principal");
        System.out.println("Entre com uma opcao: ");
    }
    
    /**
     * Metodo que lista um Pedido, com todas as informações dele como codigo dos itens no pedido
     * quantidade,o nome dos itens e a quantidade e o valor desse item no pedido
     * @param pedido - O pedido de um cliente
     */
    public void imprimirPedido(Pedido pedido){
            DecimalFormat df =  new DecimalFormat("0.00"); 
            HashMap<Item,Integer> hashItens = pedido.getHash();
            if(pedido == null){
                System.out.println("Nenhum Pedido em aberto!");
                return;  
            }
                System.out.println("Codigo do Pedido: "+ pedido.getCodigo());
                    for ( Entry<Item, Integer> entry: hashItens.entrySet()) {
                        int i=0;
                        Item itemAux = entry.getKey();
                        float precoCusto = itemAux.getPrecoDeCusto();
                        float margemLucro = itemAux.getMargemDeLucro();
                        float preco = precoCusto*(1+margemLucro/100);
                        System.out.println("Nº: " +(i+1) + "  Codigo do Item: " + itemAux.getCodigo()
                        + "  Item: " +itemAux.getNome() +" \tQuantidade no pedido: "
                        + entry.getValue() +"  \tPreco Unit. "
                        + df.format(preco)+"  \tPreco Total: "
                        + df.format(preco*(entry.getValue())));
                        
                    }
                    System.out.println();
    }
    
    /**Metodo que Cadastra um novo item na lista de itens do pedido de um cliente
     * Verifica se há disponibilade no estoque
     * e se a quantidade no pedido não ultrapassa a quantidade no estoque
     * Quando o item é inserido na lista de itens do pedido é descontado do estoque a quantidade de itens desse pedido
     * @param pedido - Pedido de um cliente
     * @param itemDao - Funções que ajudam na busca de um item no estoque para certificar a disponibilidade
     * dentre outras coisas
     */
    public void CadastrarItem(Pedido pedido, ItemDAO itemDao){
                   
                    int qunt=0;
                    Item item,itemAux;
                    boolean op=false;
                    Scanner scanner = new Scanner(System.in);
                    
                    System.out.println("Nome do produto: ");
                    String aux2 = scanner.nextLine();
                    item = itemDao.buscaItemNome(aux2);
                    if(item==null){
                        System.out.println("Desculpe, todos nossos(as) "+aux2+" ja foram vendidos!");
                        return;
                    }else{
                        HashMap<Item,Integer> hashItens;
                        hashItens = pedido.getHash();

                        for ( Entry<Item, Integer> entry: hashItens.entrySet()) {
                            itemAux = entry.getKey();
                            if(itemAux.getNome().equals(aux2)){
                                op=true;
                                System.out.println("Quantidade de itens? ");
                                qunt = Integer.parseInt(scanner.nextLine());
                                if(qunt > item.getQuantidade()){
                                    System.out.println("Infelizmente temos "+ item.getQuantidade()+" itens no estoque!");
                                    return;
                                }else{
                                    int qtdItem = itemAux.getQuantidade();
                                    itemAux.setQuantidade(qtdItem - qunt );
                                    qunt = entry.getValue() + qunt;
                                    entry.setValue(qunt);
                                    
          
                                 }   
                            }
                        }
                      }
                      if(!op){
                            System.out.println("Quantidade de itens? ");
                            qunt = Integer.parseInt(scanner.nextLine());
                            if(qunt > item.getQuantidade()){
                               System.out.println("Infelizmente temos "+ item.getQuantidade()+" itens no estoque!");
                               return;
                            }else{
                                int qtdItem = item.getQuantidade();
                                item.setQuantidade(qtdItem - qunt);
                                pedido.setItem(item,qunt);
                        }   
                      }
                    float precoCusto = item.getPrecoDeCusto();
                    float margemLucro = item.getMargemDeLucro();
                    float preco = precoCusto*(1+margemLucro/100);
                    float total = 0;
                    total = total+(preco*qunt);
                    pedido.setPreco(total);
    }
    
    /**Metodo que altera um pedido, sua quantidade, adiciona um novo item, ou remove um item que o
     * cliente já não deseja mais
     * @param itemDao - Funções que ajudam na busca de um item no estoque para certificar a disponibilidade
     * dentre outras coisas
     * @param pedidoDao - Funções que ajudam na busca de um pedido na lista de pedidos em aberto dentre outras coisas
     */
    public void alterarPedido(ItemDAO itemDao,PedidoDAO pedidoDao){
        Scanner scanner = new Scanner(System.in);
        int codigoAux;
        byte op;
        Pedido pedidoAux;
        Item itemAux;
        
        System.out.println("Entre com o codigo do pedido: ");
        codigoAux = Integer.parseInt(scanner.nextLine());
        pedidoAux = pedidoDao.buscaPedidoCodigo(codigoAux);
        
        if(pedidoAux!=null){
            do {
                 System.out.println("--------Alteração de pedido-------");
                 System.out.println("\n(1)adicionar novo item");
                 System.out.println("(2)excluir item");
                 System.out.println("(3)mudar quantidade de um Item");
                 System.out.println("(4)voltar");
                 System.out.println("escolha uma opção: ");
                 op = Byte.parseByte(scanner.nextLine());
                 switch(op){
                     case 1:
                         CadastrarItem(pedidoAux,itemDao);
                         imprimirPedido(pedidoAux);
                         break;
                     case 2:
                         System.out.println("Entre com o nome do item: ");
                         itemAux = itemDao.buscaItemNome(scanner.nextLine());
                         if(itemAux != null){
                             int qtdItem = pedidoAux.getHash().get(itemAux);
                             if(pedidoAux.getHash().remove(itemAux)==null){                                
                                 System.out.println("item Nao encontrado");
                             }else{
                                 itemAux.setQuantidade(qtdItem + itemAux.getQuantidade());
                                 System.out.println("item Excluido ");
                                 imprimirPedido(pedidoAux);
                             }
                             break;    
                         }
                         System.out.println("item Nao encontrado");
                         break;
                     
                     case 3:
                         
                         System.out.println("Entre com o nome do item: ");
                         itemAux = itemDao.buscaItemNome(scanner.nextLine());
                         if(itemAux != null){

                             if(pedidoAux.getHash().containsKey(itemAux)){
                                 
                                 System.out.println("Entre com a nova quantidade: ");
                                 int novaQtd = Integer.parseInt(scanner.nextLine());
                                 if(novaQtd > itemAux.getQuantidade()){
                                     System.out.println("Infelizmente temos "+
                                             itemAux.getQuantidade()+" itens no estoque!");
                                     break;
                                 }
                                 novaQtd = itemAux.getQuantidade() - novaQtd + pedidoAux.getHash().get(itemAux);
                                 pedidoAux.getHash().put(itemAux, novaQtd);
                                 itemAux.setQuantidade(novaQtd);
                                 imprimirPedido(pedidoAux);
                             }else{    
                                 System.out.println("item nao encontrado");
                             }
                             break;    
                         }
                         System.out.println("item Nao encontrado");
                         
                         break;
                     case 4:
                         pedidoDao.escreverArquivo();
                         break;
                     default:
                         System.out.println("opcao invalida!!");
                 }
            }while(op!=4);
        }else{
            System.out.println("Pedido nao existente!");
        }
        
    }
    
    /**Função que termina(fecha) o pedido do cliente, ou seja remove o pedido da lista de pedidos em aberto
     * e emite a nota fiscal do pedido para o cliente
     * e adiciona essa nota a uma lista para cadastrar um historico de pedidos
     * @param pedidoDao - Funções que ajudam na busca de um pedido na lista de pedidos em aberto dentre outras coisas
     * @param pedido - Pedido de um cliente
     * @param notaFiscalDao - Funções para gravar a nota em um arquivo de texto e adicinar ela em uma lista
     * de notas fiscais
     */
    public void fecharPedido(PedidoDAO pedidoDao,Pedido pedido, NotaFiscalDAO notaFiscalDao){
        
        GregorianCalendar date = new GregorianCalendar();
        NotaFiscal novaNota = new NotaFiscal();
        
        pedidoDao.excluirPedido(pedido.getCodigo());
        novaNota.setData(date.getTime());
        novaNota.setPedido(pedido);
        
        notaFiscalDao.adicionarNotaFiscal(novaNota);    
        
    }
    
    /**Metodo que exibe para o usuario as opcoes que ele tera para
     * fazer um novo pedido,
     * listar todos os pedidos em aberto
     * alterar os intens de um pedido
     * listar pedidos fechados
     * @param itemDao - Funções que ajudam na busca de um item no estoque para certificar a disponibilidade
     * dentre outras coisas
     * @param clienteDao - Funçoes que buscam um cliente na lista de cliente cadastrados dentre outras coisas
     * @param pedidoDao - Funções que ajudam na busca de um pedido na lista de pedidos em aberto dentre outras coisas
     * @param notaFiscalDao - Funções para gravar a nota em um arquivo de texto e adicinar ela em uma lista
     * de notas fiscais
     */
    public void menuOpcao(ItemDAO itemDao,ClienteDAO clienteDao,PedidoDAO pedidoDao, NotaFiscalDAO notaFiscalDao){
        
        Scanner scanner = new Scanner(System.in);
        MenuCliente menuCliente = new MenuCliente();
        byte opcao;
        do{
            imprimirMenu();
            opcao = Byte.parseByte(scanner.nextLine());
            switch(opcao){
                case 1:
                    Pedido pedido = new Pedido();
                    pedido.setCodigo(pedidoDao.proximoCodigo());
                    System.out.println("CPF do cliente: ");
                    String cpf = scanner.nextLine();
                    if((clienteDao.buscaCpf(cpf))==null){
                        System.out.println("Cliente nao consta no cadastro!");
                        System.out.println("\nDeseja fazer o cadastro?sim ou nao");
                        String aux = scanner.nextLine();
                        if(aux.equals("sim")){
                            pedido.setCliente(menuCliente.CadastroCliente(clienteDao));                            
                            System.out.println("---fim do cadastro--\n\n");
                        }else{
                            break;
                        }
                    }else{
                    pedido.setCliente(clienteDao.buscaCpf(cpf));
                    }
                    String op;
                    do{
                        CadastrarItem(pedido,itemDao);
                        System.out.println("Deseja comprar outro item? sim ou nao");
                        op = scanner.nextLine();
                    }while(op.equals("sim"));
                    pedidoDao.adicionarPedido(pedido);
                    pedidoDao.escreverArquivo();
                    imprimirPedido(pedido);
                    break;
                
                case 2:
                    for (Pedido p : pedidoDao.getListaPedidos()) {
                         imprimirPedido(p);
                    }
                    break;
                case 3:
                    alterarPedido(itemDao, pedidoDao);
                    break;
                case 4:
                    System.out.println("entre com o codigo do pedido: ");
                    int aux = Integer.parseInt(scanner.nextLine());
                    Pedido pedidoAux = pedidoDao.buscaPedidoCodigo(aux);
                    if(pedidoAux != null){
                        fecharPedido(pedidoDao, pedidoAux , notaFiscalDao);
                        System.out.println("pedido fechado com sucesso");
                        notaFiscalDao.escreverArquivo();
                        pedidoDao.escreverArquivo();
                    }else{
                        System.out.println("pedido nao encontrado");
                    }
                    
                    break;
                case 5:
                    DateFormat formatter = new SimpleDateFormat("MM/dd/yy"); 
                    
                    for (NotaFiscal nota : notaFiscalDao.getNotasFiscais()) {
                        System.out.println("data: "+formatter.format(nota.getData()));
                        imprimirPedido(nota.getPedido());
                    }
                    break;
                case 6:
                    break;
                default:
                    System.out.println("Opcao invalida!!");
            }
        }while(opcao!=6);
    }
}